/* class BHXJGLCamera
 * 适用于OpenGL的摄像机类
 * 支持俯仰 偏航 和滚转
 *
 *  冰河洗剑 2020.4.17
 * compute参数是为了减少矩阵不必要的重复计算，但是实际使用时不够顺手，仔细想想有没有更好的办法。
 *
 *  冰河洗剑 2020.4.2
 * 属性设置增加了compute参数，如果改参数为true，相机会立刻计算更新view矩阵
 *
 *  冰河洗剑 2019
 * 创建日期比这个项目早具体忘了，肯定是19年
*/


#ifndef BHXJGLCAMERA_H
#define BHXJGLCAMERA_H
#include "bhxjglinclude.h"
#include "BHXJControls_global.h"
class BHXJCONTROLS_EXPORT BHXJGLCamera
{
public:
  BHXJGLCamera();
  virtual ~BHXJGLCamera();

  ///获取俯仰角
  const float & GetPitch();
  ///设置俯仰角
  void SetPitch(const float & value,bool compute=false);

  ///设置俯仰角限制,如 limit=true,则俯仰角将被限制在±90(可以=±90)
  void PitchLimit(bool limit=true);

  ///获取偏航角
  const float & GetYaw();
  ///设置偏航角
  void SetYaw(const float &value,bool compute=false);

  ///获取滚转角
  const float &GetRoll();
  ///设置滚转角
  void SetRoll(const float & value,bool compute=false);

  ///获取摄像机位置
  const glm::vec3 & GetPosition();
  ///设置摄像机位置
  void SetPosition(const glm::vec3 & value,bool compute=false);

  void ForWard_Move(const float & value,bool compute=false);
  void BackWard_Move(const float & value,bool compute=false);
  void LeftWard_Move(const float & value,bool compute=false);
  void RightWard_Move(const float & value,bool compute=false);

  ///获取视野矩阵
  const glm::mat4 &View(bool compute=false);
  ///查看正交基底
  const glm::mat4 &CBase(bool compute=false);
  ///用这个函数来刷新View矩阵也显得怪怪的，不够顺手
  void setView();

protected:


  ///俯仰角
  float pitch=0;
  ///俯仰角限制
  bool pitchlimit=false;


  ///偏航角
  float yaw=0;
  ///滚转角
  float roll=0;

  ///摄像机位置
  glm::vec3 position{0.0f};


  glm::mat4 cbase{1.0f};
  ///获取单位正交基底
  void setCBase();

  glm::mat4 view{1.0f};

};



#endif // BHXJGLCAMERA_H
